{
 "cells": [
  {
   "cell_type": "markdown",
   "source": [
    "## ResNet——MNIST"
   ],
   "metadata": {
    "collapsed": false
   },
   "id": "1b2ec29b0c3ee48a"
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "initial_id",
   "metadata": {
    "collapsed": true,
    "ExecuteTime": {
     "end_time": "2025-06-11T00:29:37.667643Z",
     "start_time": "2025-06-11T00:29:29.927564Z"
    }
   },
   "outputs": [],
   "source": [
    "import os\n",
    "import gzip\n",
    "import numpy as np\n",
    "import torch\n",
    "import torch.nn as nn\n",
    "import torch.optim as optim\n",
    "from torch.utils.data import Dataset, DataLoader\n",
    "import torchvision.transforms as transforms\n",
    "from sklearn.metrics import accuracy_score, precision_recall_fscore_support, confusion_matrix, classification_report\n",
    "import matplotlib.pyplot as plt\n",
    "import seaborn as sns\n",
    "import time"
   ]
  },
  {
   "cell_type": "code",
   "outputs": [],
   "source": [
    "\n",
    "# 数据集路径\n",
    "mnist_data_dir = r'D:\\Machine_learning\\jiqixuexi\\mnist\\mnist\\MNIST\\raw'\n",
    "\n",
    "# 自定义MNIST数据集加载函数\n",
    "def load_mnist(data_dir):\n",
    "    # 加载训练数据\n",
    "    with gzip.open(os.path.join(data_dir, 'train-images-idx3-ubyte.gz'), 'rb') as f:\n",
    "        train_images = np.frombuffer(f.read(), np.uint8, offset=16).reshape(-1, 28, 28, 1)\n",
    "    with gzip.open(os.path.join(data_dir, 'train-labels-idx1-ubyte.gz'), 'rb') as f:\n",
    "        train_labels = np.frombuffer(f.read(), np.uint8, offset=8)\n",
    "\n",
    "    # 加载测试数据\n",
    "    with gzip.open(os.path.join(data_dir, 't10k-images-idx3-ubyte.gz'), 'rb') as f:\n",
    "        test_images = np.frombuffer(f.read(), np.uint8, offset=16).reshape(-1, 28, 28, 1)\n",
    "    with gzip.open(os.path.join(data_dir, 't10k-labels-idx1-ubyte.gz'), 'rb') as f:\n",
    "        test_labels = np.frombuffer(f.read(), np.uint8, offset=8)\n",
    "\n",
    "    # 归一化数据\n",
    "    train_images = train_images / 255.0\n",
    "    test_images = test_images / 255.0\n",
    "\n",
    "    return train_images, test_images, train_labels, test_labels\n",
    "\n",
    "# 自定义MNIST数据集类\n",
    "class CustomMNISTDataset(Dataset):\n",
    "    def __init__(self, images, labels, transform=None):\n",
    "        self.images = images\n",
    "        self.labels = labels\n",
    "        self.transform = transform\n",
    "\n",
    "    def __len__(self):\n",
    "        return len(self.images)\n",
    "\n",
    "    def __getitem__(self, idx):\n",
    "        image = self.images[idx]\n",
    "        label = self.labels[idx]\n",
    "\n",
    "        # 将图像转换为PIL图像\n",
    "        image = torch.from_numpy(image).float().permute(2, 0, 1)  # 转换为(C, H, W)\n",
    "\n",
    "        if self.transform:\n",
    "            image = self.transform(image)\n",
    "\n",
    "        return image, label\n",
    "\n",
    "# 加载数据集\n",
    "train_images, test_images, train_labels, test_labels = load_mnist(mnist_data_dir)\n",
    "\n",
    "# 定义数据预处理\n",
    "transform = transforms.Compose([\n",
    "    transforms.Normalize((0.5,), (0.5,))\n",
    "])\n",
    "\n",
    "# 创建自定义数据集\n",
    "train_dataset = CustomMNISTDataset(train_images, train_labels, transform=transform)\n",
    "test_dataset = CustomMNISTDataset(test_images, test_labels, transform=transform)\n",
    "\n",
    "# 创建数据加载器\n",
    "train_loader = DataLoader(train_dataset, batch_size=64, shuffle=True)\n",
    "test_loader = DataLoader(test_dataset, batch_size=64, shuffle=False)"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-06-11T00:29:40.996177Z",
     "start_time": "2025-06-11T00:29:40.581819Z"
    }
   },
   "id": "c8cb8290c2f6e26d",
   "execution_count": 2
  },
  {
   "cell_type": "code",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch [1/10], Loss: 0.1728\n",
      "Epoch [2/10], Loss: 0.0498\n",
      "Epoch [3/10], Loss: 0.0362\n",
      "Epoch [4/10], Loss: 0.0279\n",
      "Epoch [5/10], Loss: 0.0229\n",
      "Epoch [6/10], Loss: 0.0215\n",
      "Epoch [7/10], Loss: 0.0151\n",
      "Epoch [8/10], Loss: 0.0154\n",
      "Epoch [9/10], Loss: 0.0141\n",
      "Epoch [10/10], Loss: 0.0134\n",
      "Training Time: 98.12 seconds\n"
     ]
    }
   ],
   "source": [
    "# 定义适用于MNIST的ResNet模型\n",
    "class ResNet(nn.Module):\n",
    "    def __init__(self):\n",
    "        super(ResNet, self).__init__()\n",
    "        self.conv1 = nn.Conv2d(1, 32, 3, padding=1)\n",
    "        self.conv2 = nn.Conv2d(32, 64, 3, padding=1)\n",
    "        self.pool = nn.MaxPool2d(2, 2)\n",
    "        self.conv3 = nn.Conv2d(64, 128, 3, padding=1)\n",
    "        self.conv4 = nn.Conv2d(128, 256, 3, padding=1)\n",
    "        self.dropout = nn.Dropout(0.5)\n",
    "        self.fc1 = nn.Linear(256 * 3 * 3, 512)\n",
    "        self.fc2 = nn.Linear(512, 10)\n",
    "\n",
    "    def forward(self, x):\n",
    "        x = self.pool(torch.relu(self.conv1(x)))\n",
    "        x = self.pool(torch.relu(self.conv2(x)))\n",
    "        x = self.pool(torch.relu(self.conv3(x)))\n",
    "        x = torch.relu(self.conv4(x)) \n",
    "        x = x.view(-1, 256 * 3 * 3)\n",
    "        x = torch.relu(self.fc1(x))\n",
    "        x = self.dropout(x)\n",
    "        x = self.fc2(x)\n",
    "        return x\n",
    "\n",
    "# 初始化模型、损失函数和优化器\n",
    "device = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\n",
    "model = ResNet().to(device)\n",
    "criterion = nn.CrossEntropyLoss()\n",
    "optimizer = optim.Adam(model.parameters(), lr=0.001)\n",
    "\n",
    "# 记录训练时间\n",
    "start_time = time.time()\n",
    "\n",
    "# 训练模型\n",
    "num_epochs = 10\n",
    "for epoch in range(num_epochs):\n",
    "    model.train()\n",
    "    epoch_loss = 0.0\n",
    "    for i, (images, labels) in enumerate(train_loader):\n",
    "        images = images.to(device)\n",
    "        labels = labels.to(device)\n",
    "        optimizer.zero_grad()\n",
    "        outputs = model(images)\n",
    "        loss = criterion(outputs, labels)\n",
    "        epoch_loss += loss.item()\n",
    "        loss.backward()\n",
    "        optimizer.step()\n",
    "    print(f'Epoch [{epoch+1}/{num_epochs}], Loss: {epoch_loss / len(train_loader):.4f}')\n",
    "\n",
    "train_time = time.time() - start_time\n",
    "print(f\"Training Time: {train_time:.2f} seconds\")"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-06-11T00:37:34.831987Z",
     "start_time": "2025-06-11T00:35:56.681506Z"
    }
   },
   "id": "b7f1c89712e0434a",
   "execution_count": 5
  },
  {
   "cell_type": "code",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Test Accuracy: 0.9909\n",
      "Inference Time: 1.21 seconds\n"
     ]
    }
   ],
   "source": [
    "# 测试模型\n",
    "model.eval()\n",
    "start_inference = time.time()\n",
    "\n",
    "with torch.no_grad():\n",
    "    correct = 0\n",
    "    total = 0\n",
    "    all_labels = []\n",
    "    all_preds = []\n",
    "    for images, labels in test_loader:\n",
    "        images = images.to(device)\n",
    "        labels = labels.to(device)\n",
    "        outputs = model(images)\n",
    "        _, predicted = torch.max(outputs.data, 1)\n",
    "        total += labels.size(0)\n",
    "        correct += (predicted == labels).sum().item()\n",
    "        all_labels.extend(labels.cpu().numpy())\n",
    "        all_preds.extend(predicted.cpu().numpy())\n",
    "    test_acc = correct / total\n",
    "    print(f\"Test Accuracy: {test_acc:.4f}\")\n",
    "\n",
    "inference_time = time.time() - start_inference\n",
    "print(f\"Inference Time: {inference_time:.2f} seconds\")"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-06-11T00:37:36.057907Z",
     "start_time": "2025-06-11T00:37:34.836991Z"
    }
   },
   "id": "acac7da93de80f1e",
   "execution_count": 6
  },
  {
   "cell_type": "code",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "Performance Metrics:\n",
      "Accuracy: 0.9909\n",
      "Precision: 0.9909\n",
      "Recall: 0.9909\n",
      "F1-score: 0.9909\n",
      "Training Time: 98.12 seconds\n",
      "Inference Time: 1.21 seconds\n",
      "\n",
      "Confusion Matrix:\n",
      " [[ 974    1    0    0    0    1    4    0    0    0]\n",
      " [   0 1131    0    1    0    0    2    1    0    0]\n",
      " [   3    1 1020    1    2    0    1    4    0    0]\n",
      " [   0    0    1 1006    0    1    0    1    1    0]\n",
      " [   0    0    0    0  972    0    1    1    0    8]\n",
      " [   1    0    0   11    0  877    1    0    0    2]\n",
      " [   1    2    0    0    1    1  952    0    1    0]\n",
      " [   0    3    6    3    0    1    0 1010    0    5]\n",
      " [   1    0    1    2    0    0    1    1  963    5]\n",
      " [   0    0    0    0    3    1    0    1    0 1004]]\n",
      "\n",
      "Classification Report:\n",
      "               precision    recall  f1-score   support\n",
      "\n",
      "           0       0.99      0.99      0.99       980\n",
      "           1       0.99      1.00      1.00      1135\n",
      "           2       0.99      0.99      0.99      1032\n",
      "           3       0.98      1.00      0.99      1010\n",
      "           4       0.99      0.99      0.99       982\n",
      "           5       0.99      0.98      0.99       892\n",
      "           6       0.99      0.99      0.99       958\n",
      "           7       0.99      0.98      0.99      1028\n",
      "           8       1.00      0.99      0.99       974\n",
      "           9       0.98      1.00      0.99      1009\n",
      "\n",
      "    accuracy                           0.99     10000\n",
      "   macro avg       0.99      0.99      0.99     10000\n",
      "weighted avg       0.99      0.99      0.99     10000\n"
     ]
    }
   ],
   "source": [
    "# 计算评估指标\n",
    "accuracy = accuracy_score(all_labels, all_preds)\n",
    "precision, recall, f1, _ = precision_recall_fscore_support(all_labels, all_preds, average='weighted')\n",
    "conf_matrix = confusion_matrix(all_labels, all_preds)\n",
    "class_report = classification_report(all_labels, all_preds)\n",
    "\n",
    "# 输出结果\n",
    "print(f\"Accuracy: {accuracy:.4f}\")\n",
    "print(f\"Precision: {precision:.4f}\")\n",
    "print(f\"Recall: {recall:.4f}\")\n",
    "print(f\"F1-score: {f1:.4f}\")\n",
    "print(f\"Training Time: {train_time:.2f} seconds\")\n",
    "print(f\"Inference Time: {inference_time:.2f} seconds\")\n",
    "print(\"Confusion Matrix:\\n\", conf_matrix)\n",
    "print(\"Classification Report:\\n\", class_report)"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-06-11T00:37:44.192297Z",
     "start_time": "2025-06-11T00:37:44.124732Z"
    }
   },
   "id": "9aaf84a4d71cee45",
   "execution_count": 7
  },
  {
   "cell_type": "code",
   "outputs": [
    {
     "data": {
      "text/plain": "<Figure size 1000x800 with 2 Axes>",
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAxUAAAK3CAYAAADzvmJbAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/TGe4hAAAACXBIWXMAAA9hAAAPYQGoP6dpAACLG0lEQVR4nOzdd3gU1dvG8TuBhGxCSWjBAqIQOgiEXhUNClIjiIo0pYMK0puiGIqCKCJVEBEQBOkiiEpVSigKIihEJaFISUggjSQk7x+8rO4PEMJkd8jO9+M11+Wemd15zs5s2Gefc2Y8MjIyMgQAAAAAd8jT7AAAAAAAZG8kFQAAAAAMIakAAAAAYAhJBQAAAABDSCoAAAAAGEJSAQAAAMAQkgoAAAAAhpBUAAAAADCEpAKAU3F/TWvgOAOAtZFUAHeZDh06qHTp0g5LmTJlFBwcrLZt2+qrr77K8n3u2rVLpUuXVu/evW+4fvny5SpdurROnDiRqdedPn265syZkxUh2v35558aPXq0Hn/8cVWqVEmPPPKI+vfvryNHjmTpfv5t165deuKJJ1ShQgW99NJLWfa6jRo10tChQ7Ps9W61r9KlS2vAgAE33eaZZ55R6dKl9eGHH2bqtb/77jsNGTLkltsNHTpUjRo1ytRr38zcuXM1cOBASf+cv6VLl9b27dtvuH1ERIR9m2vn8bXzOiws7IbP+fDDD1W6dGn74xMnTqh06dJavny5w3Z79+5Vz549VbNmTVWoUEGPPPKIhg0bpsjISPs2Q4cOve5z/b/Ltffmiy++UI8ePe78zQEAE+Q0OwAA1ytXrpzeeOMN++MrV67o77//1rx58/Taa68pT548atCgQZbv97vvvtPq1avVokWLLHm9999/X3379s2S15KkjRs3atCgQQoKClKvXr10//336++//9Znn32mtm3b6qOPPnLK+zJhwgSlp6dr1qxZKlCgQJa97tSpU5U7d+4se71b8fT01Pfff6/Lly8rV65cDutOnDihn3/++Y5ed968ebe1Xe/evdWxY8c72se/RUREaMaMGVqzZo1Du6enp77++mvVq1fvuuesW7fupq/32Wef6YknnlC1atUyHcuOHTvUtWtXPfbYY3r77beVN29eRUZGau7cuWrbtq2WLl2qYsWKqXfv3nr22Wftz5s2bZp+/fVXTZ061d7m7e0tSWrTpo0WLVqkL7/8Uk8//XSmYwIAM5BUAHeh3Llzq3Llyte1N2zYULVr19aXX37plC/PefPmVVhYmOrUqaOCBQtm+esbERkZqcGDB6t+/fp6//33lSNHDvu6J554Qs8//7yGDh2q77//Xj4+Plm679jYWFWvXl116tTJ0tctV65clr7erVStWlV79uzRli1b1LhxY4d169atU9myZXX48GGn7b9YsWJZ8jrvvvuumjZtqsDAQIf2qlWr6ttvv9Wbb76pnDkd/3n7r/7lyZNHw4cP1+rVqzN97syYMUMVK1bUlClT7G01a9ZUw4YNFRISok8++URvvPGGihUr5tD//Pnzy9vb+4afc09PT3Xv3l1hYWFq1qzZdQkgANyNGP4EZCPe3t7y8vK6rn3p0qV66qmn7EMvPvzwQ6WlpdnXx8TEaODAgapbt64qVqyoli1bauXKlde9Tv/+/ZWYmOhQJbmZU6dO6bXXXlONGjX08MMPq1OnTvr111/t668NG5k6darDEJI79dlnnyklJUUjR450SCgkycfHR0OGDFGbNm108eJFe/sPP/yg559/XsHBwapZs6YGDBig06dP29cvX75c5cqV088//6x27dqpYsWKeuSRRzR79mxJ/wx3OXnypFauXKnSpUtr165d1w2L+Xef/z10aN26dWrRooUqVaqkWrVqaeDAgTp79qx9/f8Of7p06ZLGjRunxx9/XBUrVlSzZs20bNkyh300atRIU6ZM0YQJE1SnTh1VqlRJL730kv78889bvodFixZVhQoV9PXXX1+3bt26dXrqqaeuaz9x4oQGDx6sevXqqXz58qpdu7YGDx6sCxcuSLo6XG/37t3avXu3/f25Nhxp8eLFevTRR1WnTh1t377dYfjTd999d9379eeff6py5cr/OZTq999/1+bNm9W8efPr1jVt2lSxsbH68ccfHdqPHDmiv/76S02aNLnhaw4ZMkSRkZF67733brrfmzl//vwN2wsXLqyRI0eqbt26mX5NSXrssceUnJx83fEHgLsVSQVwF8rIyFBaWpp9uXz5so4fP66RI0cqISFBLVu2tG87c+ZMjRo1SrVr19aMGTPUvn17zZ49W6+//rp9m0GDBunYsWN68803NWvWLJUrV05DhgzRrl27HPZbokQJvfzyy/r222+1du3am8YXExOjZ599VocOHdKoUaM0adIkpaenq3379oqIiJAkLVmyRNLVoRzX/t+Ibdu2qVy5ctf9On1NzZo19dprr6lw4cKSpFWrVunFF19UYGCg3nvvPQ0bNkz79+9Xu3btFB0dbX9eenq6+vXrp6ZNm2rWrFkKDg7WxIkTtW3bNhUuXFhLlixRoUKF1LBhQy1ZskTly5e/rXj37t2rgQMHqnHjxpo9e7aGDRumnTt33nROQ3Jysp5//nmtXr1aL774oqZNm6bg4GCNGDFCM2bMcNh2/vz5+uOPPzRu3Di9/fbb+uWXX257bkbTpk21efNmJScn29v++OMPHTlyRE2bNnXYNikpSR07dlRERITeeOMNzZkzRy+88ILWrl1r/wL+xhtvqFy5cipXrtx178/kyZM1ZMgQDRky5Lpf5B977DG1atVKM2fOVEREhK5cuaKhQ4cqf/78GjVq1E3jX7NmjQoVKqSqVatet65kyZIKCgq6Lmn66quvVKNGDRUqVOiGr1mrVi21a9dOn332mfbs2XPTfd/II488ov3796tDhw5atmyZoqKi7Ovatm2rxx9/PFOvd02uXLn06KOPXjfECwDuVgx/Au5C4eHh13159fDwUKlSpfTBBx/Yf+29dOmSpk+frnbt2mnkyJGSpHr16snf318jR45Uly5dFBQUpN27d6t37972Lzg1a9aUv7//db/4S9JLL72kjRs3asyYMapVq9YNh0F9+umnio2N1eeff6777rtPktSgQQM1bdpUH3zwgaZMmWL/ElmkSJEbDvHIrDNnzqhs2bK3tW16erreffdd1alTR5MnT7a3V61aVU2bNtXcuXM1aNAgSVcTuN69e6tt27aSpODgYG3cuFGbN29W/fr1VblyZXl7eyt//vyZ6sfevXuVK1cudevWzT58xd/fXwcPHlRGRoY8PDwctl++fLl+//13LVq0SMHBwZKk+vXrKy0tTdOmTdOzzz4rf39/SVeHqU2bNs1+/CIjI/Xhhx/qwoULCggI+M+4mjRponfffVdbtmzRE088IelqlaJKlSr2Y3nNX3/9pSJFimj8+PH2oTu1atXSwYMHtXv3bklXv8hfmxfyv+/Ps88+qyeffPKmsYwYMUI7duzQ6NGjVb9+fR08eFDz58//z3kmO3fuVMWKFa97//7dv08//VSpqan2qt66devUs2fP/3hXpMGDB2vbtm0aMWKEVq1addvDoF599VVdunRJX375pf09CQwM1COPPKJOnTqpRIkSt/U6N1KxYkWtW7dO8fHxLp17AwB3gkoFcBcqX768li1bpmXLlumjjz5SqVKlVLx4cU2ePNnhS9r+/fuVlJSkRo0aOVQ2riUdP/zwg6SrScSHH36oV199VcuXL1dMTIyGDBlyw4mpOXLk0Lhx45SYmKjRo0ffML4dO3aobNmyCgwMtO/T09NTDRo0uG7oyX9JT093iPvfQ7b+l4eHh65cuXJbr/vnn3/q3Llz1w2RKVasmKpUqXJdhaZKlSr2/7+WQCQmJt52P26kevXqSk5OVvPmzTV58mTt3btX9erVU9++fW/4hXj37t2677777AnFNS1atNDly5cdJlFXrFjRISEsUqSIpKuVhVu59957VblyZYdf89etW6dmzZpdt23ZsmW1aNEi3X///YqKitK2bds0d+5c/fHHH0pNTb3lvm417C1v3rx6++23tXv3bk2ePFndunW75WTpqKgo3X///Tdd37RpU8XFxdnPw59//llnzpy5bg7J//Lz81NYWJj++usvh0T0Vry9vfXWW29p8+bNCgsLU/PmzZWRkaElS5aoZcuW2rBhw22/1v+677777BdpAIC7HZUK4C7k5+enihUrSrr6BbJKlSpq2bKlXnzxRa1YsUL58+eXdHUCsSR17979hq9zbfz+5MmTNWPGDH399ddav369PD09VadOHY0ePVpFixa97nklS5ZU37599d57793wEraxsbE6fvz4TYcCJSUlyWaz3bKfH330kcPVbyTpt99+u+G29913n06dOnXT10pLS1NMTIwKFy5sf19uVGUpWLCgw9wPSdf9Ku3p6Wn4vgtVqlTRrFmzNG/ePM2ZM0czZsxQoUKF1K1bN3Xq1Om67ePi4m4arySHuSL/+956el79fSg9Pf22YmvSpInef/99JSUl6fjx4/rrr79uWlH45JNPNHPmTF24cEEFCxZU+fLlZbPZdOnSpVvu53aulFW7dm3dc889On369G1dbjY+Pv4/z60HH3xQZcuW1fr169WwYUOtW7dO9erVU758+W4rlnbt2mn+/Pn2Ks7tKlSokNq0aaM2bdpIunqZ24EDB+rNN99USEiI/Rhlhq+vryTd1nsNAGajUgFkAwUKFNDrr7+uv//+2+Ga+nnz5pUkTZw40V7Z+PfSoUMHSVevbjNo0CB9//33+vrrr/Xaa69p3759evPNN2+6z65du6pChQoaM2aMwxyEa69Xo0aNG+5z2bJl9ktj3sozzzxz3XNvpl69evr111917ty5G67ftm2b6tevr6+++so+TOhGk2jPnTt3yyFCt3Kt0vDvyklCQsJ129WvX19z5sxReHi4ZsyYoaCgII0dO/aGl27Nly/fTeOVZDjmf3vyySeVnJysLVu26Ouvv1atWrVumACsWbNG48eP14svvqgdO3bohx9+0KxZs1S8ePEsi+Wjjz7S+fPnVaJECY0cOVIpKSn/ub2/v/8tv2Q3bdpU3377rVJSUrR+/fobTkC/mcGDB6tIkSIaNmyYw7yTG/n5559Vp04de0Xw32rWrKmXXnpJ0dHR9kntmRUXFycpa489ADgLSQWQTTRu3Fj169fX2rVr7cN3Hn74YXl5eenMmTOqWLGiffHy8tKkSZN04sQJnTx5Ug0bNtT69eslSQ899JC6deumOnXq/Oewihw5cmj8+PGKj4/XzJkzHdbVqFFDf/75px588EGH/a5evVpLly61D8251a+zgYGBDs+/Vp25kfbt28vLy0tvv/32dcOgkpKSNGXKFOXLl0+PPvqoHnzwQRUqVOi6Sa5RUVH66aefbjjJNzOujW//95Wk9u3b57DNhAkT1KZNG2VkZMhms+nRRx+1X9Xo38+7pnr16jp58qT27t3r0L569Wp5eXmpUqVKhmL+t8DAQAUHB+ubb77R119/fdMv3Xv37lWePHnUvXt3e3UsISFBe/fudaiK3Mmv8JJ08OBBzZ49Wz179tSkSZP0xx9/3PLGe/fdd98N379/a9KkiS5evKhp06YpLi4uUzfcy507t95++2399ddft7zAQPHixZWUlKT58+ffsEr0559/qlChQvb3LrP+/vtv5ciR46YXJwCAuwlJBZCNDB8+3P7FOi0tTQEBAeratas++OADvf/++9qxY4dWrlypXr16KTIyUmXKlNF9992nIkWK6O2339ayZcu0e/duzZ0712Gi7s0EBQWpT58+1/0y3LlzZ6Wnp6tz585at26dduzYoVGjRmn+/Pl66KGH7NvlzZtX+/fvV3h4uOHhRPfff79Gjx6tjRs3qn379lq5cqV27dqlpUuXqk2bNjp69Kg++OAD+fr6ytPTU6+99pp+/PFH9e/fX1u2bNHKlSvVpUsX5cuXT126dDEUS8OGDSVJo0aN0o8//qjly5frjTfekJ+fn32b2rVr26/K9MMPP2jz5s16++235e/vr1q1al33mqGhofZhZ59//rm2b9+ut956S19++aV69Ohhr0pllSZNmuibb77R6dOnFRIScsNtKlWqpEuXLmn8+PHatWuX1qxZo/bt2+v8+fMO8zfy5s2rP//8Uzt27LD/un4rKSkpGjp0qB588EF1795dZcuWVceOHTVnzpz/vAlf3bp1tX///v88n4oWLaqKFSvq448/1qOPPupwXG5H3bp11bZt21tWRPLly6chQ4Zo8+bNev7557V8+XKFh4fr+++/17Bhw7RkyRINHTr0ppPKb2Xv3r2qVq3abQ0lBACzkVQA2chDDz2kDh066Pfff9eCBQskSf369dPQoUO1ceNGdevWTe+++66Cg4O1YMEC5cmTR9LVe0XUr19fH3zwgV588UV9/vnn6tu3r/r06XPLfXbr1u26uROBgYFavHix7rvvPo0ePVo9e/bUgQMHFBYWps6dO9u369mzpw4ePKhu3brd8tfl29G6dWstWLBAgYGBev/999W1a1dNnz5dZcqU0cqVK1W7dm37tqGhoZoyZYqOHz+uPn36aPz48apSpYqWLVt200uL3q4HH3xQEyZM0KlTp9S9e3d9+umnGjNmjP1yttLVq2FNnDhRR48eVd++ffXaa6/JZrNp/vz59uFZ/2az2fTZZ5/Z70PRq1cv7d27V2FhYXr55ZcNxXsjTz75pNLT01W/fv2bJiytW7dWnz599PXXX6tbt26aMmWKqlWrprfeekuxsbE6duyYpH+qSN26ddPWrVtva//vv/++/vjjD7399tv24XKvvPKK7rnnHg0ZMkSXL1++4fMaN26sCxcu6ODBg//5+k2bNlVqamqmhj7929ChQ3XPPffccrtnn31W8+bNU0BAgN577z116dJFw4YN0/nz5/Xpp5/ecAL87bh8+bJ27979n1fPAoC7iUeG0Z8PAQBwoZ49eyp//vwaO3as2aE4zYoVKzRp0iR9++23WX6HeABwBioVAIBspX///tqwYcN/Xg0sO7ty5Yrmzp2rvn37klAAyDZIKgAA2Urp0qXVo0cPTZw40exQnGLp0qUqXLiwnn32WbNDAYDbxvAnAAAAAIZQqQAAAABgCEkFAAAAAENIKgAAAAAYQlIBAAAAwJCcZgeQ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"
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 绘制混淆矩阵热力图\n",
    "plt.figure(figsize=(10, 8))\n",
    "sns.heatmap(conf_matrix, annot=True, fmt='d', cmap='Blues')\n",
    "plt.title(\"ResNet - Confusion Matrix (MNIST)\")\n",
    "plt.xlabel(\"Predicted Label\")\n",
    "plt.ylabel(\"True Label\")\n",
    "plt.show()"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-06-11T00:37:49.886943Z",
     "start_time": "2025-06-11T00:37:49.141254Z"
    }
   },
   "id": "7e042e42e42dc048",
   "execution_count": 8
  },
  {
   "cell_type": "code",
   "outputs": [],
   "source": [],
   "metadata": {
    "collapsed": false
   },
   "id": "4caf2ae846f1f83a"
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
